from redis import StrictRedis

redis_cli = StrictRedis(host="xx:xx:xx:xx", port=xxxx, password="xxx", db=xx)

"""单个键值对操作"""

# 添加键值对
redis_cli.set("name", "hello")

# 获取键值对
name = redis_cli.get("name")

# 给元素追加值
redis_cli.append("name", "china")

# 查看元素长度
name_len = redis_cli.strlen("name")

"""多个键值对操作"""

# 设置多个键值对
redis_cli.mset({"country": "china", "age": "1000"})

# 获取多个键值对
country, age = redis_cli.mget("country", "age")

"""数字统计"""

# .给整数类型的值加指定数值（不指定默认增加1）(如果 key 不存在，则会先初始化此 key 为 0 ，然后再执行减法操作)
redis_cli.incr("age", 12)

# 给整数类型的值减制定数值（不指定默认减1）(如果 key 不存在，则会先初始化此 key 为 0 ，然后再执行减法操作)
redis_cli.decr("age", 100)

# 根据 key 减去指定的值(如果 key 不存在，则会先初始化此 key 为 0 ，然后再执行减法操作)
redis_cli.decrby("age", 900)

# 根据 key 加指定的整数值(如果 key 不存在，则会先初始化此 key 为 0 ，然后再执行加整数值的操作)
redis_cli.incrby("age", 123)

# 根据 key 加上指定的浮点数(如果 key 不存在，则会先初始化此 key 为 0 ，然后再执行加浮点数的操作)
redis_cli.incrbyfloat("age", 3.1415)

# redis_cli.flushdb()

"""键值对过期操作"""

# 添加键值对并设置过期时间
redis_cli.set("ex", "ex", ex=100)

# 赋值字符串，并设置过期时间(单位/秒)
redis_cli.setex("setex", 100, "setex")

# 如果 key 已经存在，setex 命令将会覆写原来的旧值

# 赋值字符串，并设置过期时间(单位/毫秒)
redis_cli.psetex("psetex", 10000, "psetex")

print(redis_cli.ttl("ex"))
print(redis_cli.ttl("setex"))
print(redis_cli.ttl("psetex"))

"""字符串操作进阶"""

# 根据指定的范围截取字符串
name_range = redis_cli.getrange("name", 0, 3)
name_r = redis_cli.getrange("name", -3, -1)
print(name_range)
print(name_r)

# 设置字符串新值并返回旧值
name_gset = redis_cli.getset("name", "newhello")
print(name_gset)

# 赋值(创建)键值对，当 key 不存在时(如果 key 已经存在，则执行命令无效，不会修改原来的值，否则会创建新的键值对)
n = redis_cli.setnx("m", "myname")
nn = redis_cli.setnx("m", "hisname")
m = redis_cli.get("m")
print(m)

# 设置一个或多个键值，当所有键值都不存在时
redis_cli.msetnx({"her": "yes", "his": "no"})
redis_cli.msetnx({"her": "her", "his": "his"})
her, his = redis_cli.mget("her", "his")
print(her, his)

# 截取字符串并赋值(如果待截取的键不存在，会当作空白字符串处理)
redis_cli.setrange("exist", 3, "workd")
print(redis_cli.get("exist"))

# 数据类型(我们可以使用 object encoding key 命令来查看对象(键值对)存储的数据类型，当我们使用此命令来查询 SDS 对象时，发现 SDS 对象竟然包含了三种不同的数据类型：int、embstr 和 raw)
print(redis_cli.object("encoding", "name"))
print(redis_cli.object("encoding", "wo"))
print(redis_cli.object("encoding", "her"))
